package com.itheima.controller;


import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.itheima.pojo.*;
import com.itheima.service.DeptService;
import com.itheima.service.EmpService;
import com.itheima.service.impl.EmpExprServiceImpl;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;

import java.time.LocalDateTime;
import java.util.List;

@Slf4j
@RestController
@RequestMapping("/emps")
public class EmpController {
    @Autowired
    private EmpService empService;
    @Autowired
    private EmpExprServiceImpl empExprService;

    @GetMapping
    public Result page(EmpQueryParam param) {
        log.info("员工列表查询条件：{}", param);
        PageResult<Emp> pageResult=empService.pageSearch(param);
        // 返回结果
        return Result.success(pageResult);
    }

    @PostMapping
    public Result save(@RequestBody Emp emp) {
        log.info("新增员工，员工信息：{}", emp);

        // 调用service层方法保存员工信息和员工的工作经历信息
        //调用mapper层方法,该方法由mybatisplus 自动生成
        //1.新增员工且设置创建时间以及更新时间
        emp.setCreateTime(LocalDateTime.now());
        emp.setUpdateTime(LocalDateTime.now());
        empService.save(emp);

        //2.设置工作经历表中的empId与新增员工id建立关联
        List<EmpExpr> empExpr = emp.getExprList();
        for (EmpExpr expr : empExpr) {
            expr.setEmpId(emp.getId());
        }
        //3.新增员工工作经历
        empExprService.saveBatch(empExpr);

        return Result.success();
    }

    @DeleteMapping
    @Transactional(rollbackFor = Exception.class)
    public Result delete(@RequestParam List<Integer> ids) {
        log.info("批量删除学生，{}", ids);

        // 调用service层方法批量删除员工信息和员工工作经历信息
        //1.根据id删除员工信息
        empService.removeBatchByIds(ids);
        //2.根据id删除工作经历
        empExprService.remove(new LambdaQueryWrapper<EmpExpr>().in(EmpExpr::getEmpId, ids));
        return Result.success();
    }

    @GetMapping("/{id}")
    public Result getById(@PathVariable Integer id) {
        log.info("根据ID查询员工信息，id：{}", id);
        //1.根据id查询员工
        Emp emp = empService.getById(id);
        //2.根据工作经历表的empId查询工作经历
        emp.setExprList(empExprService.list(new LambdaQueryWrapper<EmpExpr>().eq(EmpExpr::getEmpId, id)));
        return Result.success(emp);
    }

    @PutMapping
    @Transactional(rollbackFor = Exception.class)
    public Result update(@RequestBody Emp emp) {
        log.info("修改员工信息，员工信息：{}", emp);

        // 调用service层方法修改员工信息
        //1.根据id修改员工信息更新操作时间
        emp.setUpdateTime(LocalDateTime.now());
        empService.updateById(emp);
        //2.根据工作经历表的empid删除所有工作经历
        empExprService.remove(new LambdaQueryWrapper<EmpExpr>().eq(EmpExpr::getEmpId, emp.getId()));
        //3.设置新的工作经历然后保存
        /**
         *从emp中获取更新后的工作经历*/
        List<EmpExpr> exprList = emp.getExprList();
        //判断集合是否为空 也就是判断前端参数中的工作经历是否为空
        if (exprList !=null && !exprList.isEmpty() ) {
            exprList.forEach(expr -> expr.setEmpId(emp.getId()));
        }
        empExprService.saveBatch(exprList);
        return Result.success();
    }

    @GetMapping("/list")
    public Result list() {
        log.info("查询员工列表");

        // 调用service层方法查询员工列表
        //查询所有员工
        List<Emp> list = empService.list();
        return Result.success(list);
    }
}
